package miniprojet.jeux.stateless;

import java.util.Collection;

import miniprojet.jeux.modele.Administrateur;
import miniprojet.jeux.modele.Arbitre;
import miniprojet.jeux.modele.But;
import miniprojet.jeux.modele.Equipe;
import miniprojet.jeux.modele.Joueur;
import miniprojet.jeux.modele.Match;
import miniprojet.jeux.modele.Personne;
import miniprojet.jeux.modele.Tour;

public interface Tournoi {

	/**
	 * Peuple la base de données.
	 */
	public void peupler();

	/**
	 * Démarre le tournoi si aucun tour d'inscris (nécessite un nombre d'équipe
	 * a 2, 4, 8, 16 ou 32)
	 */
	public void demarrerTournoi();

	/**
	 * Retourne les tours du tournoi
	 * 
	 * @return les tours du tournoi
	 */
	public Collection<Tour> getTours();

	/**
	 * Retourne les tours du tournoi triés par ordre décroissant du numéro.
	 * 
	 * @return les tours du tournoi triés par ordre décroissant.
	 */
	public Collection<Tour> getToursDesc();

	/**
	 * Ajoute un joueur
	 * 
	 * @param joueur
	 *            Joueur à ajouter
	 */
	public void addJoueur(Joueur joueur);

	/**
	 * Ajoute une équipe
	 * 
	 * @param equipe
	 *            Equipe à ajouter
	 */
	public void addEquipe(Equipe equipe);

	/**
	 * Retourne tous les joueurs d'une équipe
	 * 
	 * @param nomEquipe
	 *            Nom de l'équipe cherchée
	 * @return la liste des joueur de l'quipe en paramètre
	 */
	public Collection<Joueur> getAllJoueursByEquipe(String nomEquipe);

	/**
	 * Retourne le joueur avec l'id passé en paramètre
	 * 
	 * @param id
	 *            Identifiant du joueur cherché
	 * @return le joueur avec l'id en paramètre
	 */
	public Joueur getJoueur(int id);

	/**
	 * Retourne tous les arbitres
	 * 
	 * @return tous les arbitres
	 */
	public Collection<Arbitre> getAllArbitres();

	/**
	 * Retourne tous les arbitres disponibles i.e. les arbitres qui ne sont pas
	 * affecté a un match prévu ou en cours
	 * 
	 * @return tous les arbitres disponibles
	 */
	public Collection<Arbitre> getAllArbitresDisponible();

	/**
	 * Retourne l'arbitre avec l'id passé en paramètre
	 * 
	 * @param id
	 *            Identifiant de l'arbitre recherché
	 * @return l'arbitre avec l'id passé en paramètre
	 */
	public Arbitre getArbitre(int id);

	/**
	 * Ajoute l'arbitre passé en paramètre
	 * 
	 * @param arbitre
	 *            Arbitre à ajouter
	 */
	public void addArbitre(Arbitre arbitre);

	/**
	 * Modifie l'arbitre passé en paramètre
	 * 
	 * @param arbitre
	 *            Arbitre à modifier
	 */
	public void setArbitre(Arbitre arbitre);

	/**
	 * Supprime l'arbitre avec l'id passé en paramètre
	 * 
	 * @param id
	 *            Identifiant de l'arbitre à supprimer
	 */
	public void deleteArbitre(int id);

	/**
	 * Retourne une équipe par son nom
	 * 
	 * @param nom
	 *            Nom de l'équipe cherchée
	 * @return L'équipe avec le nom passé en paramètre
	 */
	public Equipe getEquipeByName(String nom);

	/**
	 * Ajoute un représentant
	 * 
	 * @param representant
	 *            Représentant à ajouter
	 */
	public void addRepresentant(Personne representant);

	/**
	 * Retourne le match avec l'identifiant donné.
	 * 
	 * @param id
	 *            identifiant du match.
	 * @return le match correspondant.
	 */
	public Match getMatch(int id);

	/**
	 * Met à jour le match passé en paramètre
	 * 
	 * @param match
	 *            Match à mettre à jour
	 */
	public void setMatch(Match match);

	/**
	 * Ajoute un but à un match
	 * 
	 * @param but
	 *            But à ajouter
	 * @param match
	 *            Match auquel le but va être ajouté
	 */
	public void addBut(But but, Match match);

	/**
	 * Retourne toutes les équipes.
	 * 
	 * @return toutes les équipes.
	 */
	public Collection<Equipe> getAllEquipes();

	/**
	 * Retourne l'équipe avec l'identifiant donné.
	 * 
	 * @param id
	 *            identifiant de l'équipe.
	 * @return l'équipe correspondante.
	 */
	public Equipe getEquipe(int id);

	/**
	 * Identifie un administrateur avec son login et mot de passe
	 * 
	 * @param login
	 *            identifiant de l'administrateur
	 * @param pwd
	 *            mot de passe de l'administrateur
	 * @return l'administrateur si login et mot de passe correct, null sinon
	 */
	public Administrateur authentifierAdministrateur(String login, String pwd);

	/**
	 * Retourne si le tour actuel est fini ou non
	 * 
	 * @return Vrai si le tour actuel est terminé, faux sinon
	 */
	public boolean isDernierTourFini();

	/**
	 * Crée le tour suivant si le tour actuel est terminé
	 */
	public void nouveauTour();

	/**
	 * Retire un but d'un match
	 * 
	 * @param match
	 *            Match auquel retirer le but
	 * @param idBut
	 *            Identifiant du but à retirer
	 */
	public void removeBut(Match match, int idBut);
}
